"""
主窗口 UI
"""

import tkinter as tk
from typing import Optional

from ..models import SAMModel, ImageProcessor, ClipManager, DepthProcessor, DepthEstimator, BackgroundRemover
from ..utils import Config, get_logger

from .main_window_components import (
    ToolbarMixin,
    CanvasDisplayMixin,
    ImageHandlerMixin,
    ModelManagerMixin,
    ModelDownloadMixin,
    SegmentationControllerMixin,
    HistoryManagerMixin,
    EventHandlerMixin,
    DragDropHandlerMixin,
    OtherFeaturesMixin,
)


class MainWindow(
    ToolbarMixin,
    CanvasDisplayMixin,
    ImageHandlerMixin,
    ModelManagerMixin,
    ModelDownloadMixin,
    SegmentationControllerMixin,
    HistoryManagerMixin,
    EventHandlerMixin,
    DragDropHandlerMixin,
    OtherFeaturesMixin,
):
    """主窗口类"""
    
    def __init__(self, root: tk.Tk, config: Optional[Config] = None):
        """
        初始化主窗口
        
        Args:
            root: Tkinter根窗口
            config: 配置对象
        """
        self.root = root
        self.config = config or Config()
        self.logger = get_logger(__name__)
        
        # 设置窗口
        self.root.title(self.config.get('app.name', 'SAM Tool'))
        window_width = self.config.get('app.window_width', 1400)
        window_height = self.config.get('app.window_height', 900)
        self.root.geometry(f"{window_width}x{window_height}")
        
        # 初始化模型和处理器
        self.sam_model = SAMModel(self.config)
        self.image_processor = ImageProcessor(self.config)
        self.clip_manager = ClipManager(self.config)  # 裁剪管理器（自动加载历史数据）
        self.depth_processor = DepthProcessor(self.config)  # 景深处理器
        self.depth_estimator = DepthEstimator(self.config)  # 深度估计器（生成景深图）
        self.bg_remover = BackgroundRemover(self.config)  # 背景移除器
        
        # 裁剪库窗口引用
        self.clip_library_window = None
        
        # 状态变量
        self.image_path = None
        self.image = None  # 原始图片 (numpy array)
        self.original_image = None  # 真正的原图（用于最终裁剪，不受通道编辑影响）
        self.image_no_bg = None  # 去背景后的图片 (RGB格式)
        self.depth_map = None  # 景深图 (numpy array)
        self.depth_map_path = None  # 景深图路径
        self.current_result = None  # 当前分割结果
        self.all_results = None  # 自动分割的所有结果
        
        # 交互状态
        self.selection_mode = "auto"  # auto, point, box
        self.selected_points = []  # [[x, y], ...]
        self.selected_labels = []  # [1, 0, ...] (1=前景, 0=背景)
        self.selected_box = None  # [x1, y1, x2, y2]
        self.drawing_box = False
        self.box_start = None
        
        # 历史记录（撤销/重做功能）
        self.history_stack = []  # 历史记录栈
        self.history_index = -1   # 当前历史记录索引
        self.max_history = 50     # 最大历史记录数
        
        # 景深模式参数
        self.depth_model_type = self.config.get('depth_mode.default_model', 'DPT_Large')  # 默认景深模型类型
        self.use_depth_input = False  # 是否使用景深图作为SAM输入（默认关闭）
        
        # rembg参数
        self.rembg_model_type = "u2net"  # 默认rembg模型
        self.use_rembg = False  # 是否使用rembg预处理（默认关闭）
        
        # 显示设置
        self.original_scale = 1.0
        self.original_offset_x = 0
        self.original_offset_y = 0
        self.original_image_photo = None
        self.result_image_photo = None
        
        # 保存当前显示的结果图片数据（用于窗口调整时重绘）
        self.current_result_image = None  # numpy array
        
        # 窗口调整大小的防抖处理
        self.resize_timer_original = None
        self.resize_timer_result = None
        
        # 创建UI
        self.setup_ui()
        
        # 自动加载模型（如果配置启用）
        if self.config.get('model.auto_load', True):
            self.root.after(500, self._auto_load_model)
        
        self.logger.info("主窗口已初始化")
    
    def setup_ui(self):
        """设置用户界面"""
        # 顶部工具栏
        self._create_toolbar()
        
        # 主内容区域
        self._create_main_content()
        
        # 底部状态栏
        self._create_statusbar()
        
        # 设置拖拽支持
        self._setup_drag_drop()
        
        # 设置快捷键
        self._setup_shortcuts()
